var _ctUnits = { length: { label: 'Length', units: { 'mm': { name: 'Millimeter', f: 0.001 }, 'cm': { name: 'Centimeter', f: 0.01 }, 'm': { name: 'Meter', f: 1 }, 'km': { name: 'Kilometer', f: 1000 }, 'in': { name: 'Inch', f: 0.0254 }, 'ft': { name: 'Foot', f: 0.3048 }, 'yd': { name: 'Yard', f: 0.9144 }, 'mi': { name: 'Mile', f: 1609.344 }, 'nmi':{ name: 'Nautical mile', f: 1852 } } }, weight: { label: 'Weight', units: { 'mg': { name: 'Milligram', f: 0.001 }, 'g': { name: 'Gram', f: 1 }, 'kg': { name: 'Kilogram', f: 1000 }, 't': { name: 'Tonne (metric)', f: 1000000 }, 'oz': { name: 'Ounce', f: 28.3495231 }, 'lb': { name: 'Pound', f: 453.59237 }, 'st': { name: 'Stone', f: 6350.29318 } } }, volume: { label: 'Volume', units: { 'ml': { name: 'Milliliter', f: 0.001 }, 'l': { name: 'Liter', f: 1 }, 'm3': { name: 'Cubic meter', f: 1000 }, 'tsp': { name: 'Teaspoon (US)', f: 0.00492892 }, 'tbsp':{ name: 'Tablespoon (US)', f: 0.01478676 }, 'cup': { name: 'Cup (US)', f: 0.2365882 }, 'pt': { name: 'Pint (US)', f: 0.473176 }, 'qt': { name: 'Quart (US)', f: 0.946353 }, 'gal': { name: 'Gallon (US)', f: 3.785411784 }, 'gal_uk':{ name: 'Gallon (UK)', f: 4.54609 } } }, area: { label: 'Area', units: { 'mm2': { name: 'Square millimeter', f: 0.000001 }, 'cm2': { name: 'Square centimeter', f: 0.0001 }, 'm2': { name: 'Square meter', f: 1 }, 'ha': { name: 'Hectare', f: 10000 }, 'km2': { name: 'Square kilometer', f: 1000000 }, 'in2': { name: 'Square inch', f: 0.00064516 }, 'ft2': { name: 'Square foot', f: 0.09290304 }, 'yd2': { name: 'Square yard', f: 0.83612736 }, 'ac': { name: 'Acre', f: 4046.8564224 }, 'mi2': { name: 'Square mile', f: 2589988.110336 } } }, speed: { label: 'Speed', units: { 'mps': { name: 'Meter / second', f: 1 }, 'kmh': { name: 'Kilometer / hour', f: 0.277777778 }, 'mph': { name: 'Mile / hour', f: 0.44704 }, 'fps': { name: 'Foot / second', f: 0.3048 }, 'knot': { name: 'Knot', f: 0.514444 } } }, data: { label: 'Digital data', units: { 'b': { name: 'Byte', f: 1 }, 'kb': { name: 'Kilobyte (KB)', f: 1000 }, 'mb': { name: 'Megabyte (MB)', f: 1000000 }, 'gb': { name: 'Gigabyte (GB)', f: 1000000000 }, 'tb': { name: 'Terabyte (TB)', f: 1000000000000 }, 'kib': { name: 'Kibibyte (KiB)', f: 1024 }, 'mib': { name: 'Mebibyte (MiB)', f: 1048576 }, 'gib': { name: 'Gibibyte (GiB)', f: 1073741824 }, 'tib': { name: 'Tebibyte (TiB)', f: 1099511627776 } } } }; function _ctTempConvert(v, from, to) { var c; if (from === 'C') c = v; else if (from === 'F') c = (v - 32) * 5 / 9; else if (from === 'K') c = v - 273.15; else c = v; if (to === 'C') return c; if (to === 'F') return c * 9 / 5 + 32; if (to === 'K') return c + 273.15; return c; } function _ctPopulateUnits() { var cat = (document.getElementById('unit-category') || {}).value || 'length'; var fromSel = document.getElementById('unit-from'); var toSel = document.getElementById('unit-to'); if (!fromSel || !toSel) return; fromSel.innerHTML = ''; toSel.innerHTML = ''; if (cat === 'temperature') { ['C', 'F', 'K'].forEach(function(u){ var labels = {'C':'Celsius (°C)','F':'Fahrenheit (°F)','K':'Kelvin (K)'}; fromSel.appendChild(new Option(labels[u], u)); toSel.appendChild(new Option(labels[u], u)); }); toSel.value = 'F'; } else { var defs = _ctUnits[cat].units; Object.keys(defs).forEach(function(k) { fromSel.appendChild(new Option(defs[k].name, k)); toSel.appendChild(new Option(defs[k].name, k)); }); toSel.selectedIndex = Math.min(1, toSel.options.length - 1); } } function convert(input) { var v = parseFloat(input); if (input === '' || isNaN(v)) return ''; var cat = (document.getElementById('unit-category') || {}).value || 'length'; var from = (document.getElementById('unit-from') || {}).value; var to = (document.getElementById('unit-to') || {}).value; if (!from || !to) return ''; var result; var fromName, toName; if (cat === 'temperature') { result = _ctTempConvert(v, from, to); fromName = ({'C':'°C','F':'°F','K':'K'})[from]; toName = ({'C':'°C','F':'°F','K':'K'})[to]; } else { var defs = _ctUnits[cat].units; if (!defs[from] || !defs[to]) return ''; result = v * defs[from].f / defs[to].f; fromName = defs[from].name; toName = defs[to].name; } var rounded = Math.abs(result) < 1e-4 || Math.abs(result) >= 1e10 ? result.toExponential(6) : parseFloat(result.toPrecision(10)).toString(); return v + ' ' + fromName + ' = ' + rounded + ' ' + toName; } $(function(){ _ctPopulateUnits(); $('#unit-category').on('change', function(){ _ctPopulateUnits(); $('#box1').trigger('keyup'); }); $('#unit-from, #unit-to').on('change', function(){ $('#box1').trigger('keyup'); }); $('#unit-swap').on('click', function(){ var f = $('#unit-from').val(); var t = $('#unit-to').val(); $('#unit-from').val(t); $('#unit-to').val(f); $('#box1').trigger('keyup'); }); }); var _loadedScripts = {}; function loadScriptPromise(url) { if (_loadedScripts[url]) return _loadedScripts[url]; _loadedScripts[url] = new Promise(function (resolve, reject) { var s = document.createElement('script'); s.src = url; s.onload = resolve; s.onerror = reject; document.head.appendChild(s); }); return _loadedScripts[url]; } function replaceAll(find, replace, str) { return str.replace(new RegExp(find, 'g'), replace); } function beautify(str) { var result = ''; var length = str.length; var i = 0; var braceCountLeft = 0; var braceCountRight = 0; var withinQuotes = false; while (i < length) { var c = str[i]; if (c == '"' && (i == 0 || c[i - 1] != '\\')) { // non-escaped quotes withinQuotes = !withinQuotes; } if (!withinQuotes && (c == '}' || c == '{' || c == ',')) { console.log('Start####' + result); // look back and remove carriage returns and whitespace that are already there var resultIndex = result.length - 1; while (resultIndex >= 0 && (result[resultIndex] == ' ' || result[resultIndex] == '\r' || result[resultIndex] == '\n' || result[resultIndex] == '\t')) { resultIndex = resultIndex - 1; result = result.substr(0, resultIndex + 1); console.log('char ' + result[resultIndex] + '-----' + result + 'zzz ' + result.length + ' ' + resultIndex); } if (c == '{') { braceCountLeft++; result += c + '\r' + GetTabs(braceCountLeft - braceCountRight); } else if (c == '}') { braceCountRight++; // precede with carriage return result += '\r' + GetTabs(braceCountLeft - braceCountRight) + c; } else if (c == ',') { result += c + '\r' + GetTabs(braceCountLeft - braceCountRight); } var nextChar = ''; // advance through whitespace and remove carriage returns that are already there while (i < length && (str[i + 1] == ' ' || str[i + 1] == '\r' || str[i + 1] == '\n' || str[i + 1] == '\t')) { i++; } } else { result += str[i]; } i++; } return result; } function GetTabs(count) { var result = ''; for (var i = 0; i < count; i++) { result += ' '; } return result; }